package servidor.impl;

import servidor.bbdd.*;
import beans.*;
import common.*;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.util.Date;
import java.util.List;
import servidor.bbdd.subsistema1.GestorSubsistema1;
import servidor.bbdd.subsistema2.GestorSubsistema2;
import servidor.bbdd.subsistema3.GestorSubsistema3;
import servidor.bbdd.subsistema4.GestorSubsistema4;
import java.util.List;
import java.util.Vector;


/**
 * Classe RemoteImpl
 *
 * @author Grup Programari.cat
 * @version 1.0; java version "1.6.0";
 */
public class RemoteImpl extends java.rmi.server.UnicastRemoteObject implements RemoteInterface, Serializable {

    private static final long serialVersionUID = 1L;
    private GestorDiscoConexion gestorBD;
    private GestorSubsistema1 gestorSubsistema1;
    private GestorSubsistema2 gestorSubsistema2;
    private GestorSubsistema3 gestorSubsistema3;
    private GestorSubsistema4 gestorSubsistema4;


    /**
     * Constructor de la clase<br>
     * Crea una conexión a Base de Datos
     * @exception RemoteException
     * @exception EOlympicsException
     */
    public RemoteImpl() throws RemoteException, EOlympicsException {
        super();
        gestorBD = new GestorDiscoConexion();
        gestorBD.conectarBD();
        gestorSubsistema1 = new GestorSubsistema1(gestorBD);
        gestorSubsistema2 = new GestorSubsistema2(gestorBD);
        gestorSubsistema3 = new GestorSubsistema3(gestorBD);
        gestorSubsistema4 = new GestorSubsistema4(gestorBD);
    }


    //INICI SUBSISTEMA CONNEXIÓ I MANTENIMENT

    /**
     * Obtenir el usuari amb un login i un password<br>
     * Realitza el Login
     * @param username Nom d'usuari
     * @param password password de l'usuari
     * @return En cas que el login i password siguin correctes torna l'usuari. En cas contrari throw EOlympicsException
     * @throws  RemoteException
     * @throws EOlympicsException
     */
    public Usuari sub1login(String username,String password) throws RemoteException, EOlympicsException
     {
        Usuari usuari = gestorSubsistema1.getLogin(username, password);
        return usuari;
     }

    /**
     * Donar tota la informació completa d'un usuari concret a partir del seu id intern
     * @param idIntern Id intern de l'usuari
     * @return Retorna l'usuari consultat. En cas d'error o si l'usuari no s'ha trobat, torna null
     * @throws  RemoteException
     * @throws EOlympicsException
     */
    public Usuari sub1getUser(int idIntern)throws RemoteException,EOlympicsException
     {
         return gestorSubsistema1.getUser(idIntern);
     }

    /**
     * Realitza una búsqueda d'usuaris segons el paràmetres passats.<br>
     * Els paràmetres no són excluients, és a dir, han de coincidir tots en un usuari.<br>
     * En cas de deixar un camp buit, serà com si no es tingués en compte.
     * @param idIntern Id intern de l'usuari
     * @param nom nom de l'usuari
     * @param cognom1 cognom1 de l'usuari
     * @param cognom2 cognom2 de l'usuari
     * @return Retorna un vector amb tots els usuaris, o un vector buit en cas de no trobar usuaris que coincideixin. <br>En cas d'error torna null.
     * @throws  RemoteException
     * @throws EOlympicsException
     */
    public Vector sub1getBusqueda(int idIntern, String nom, String cognom1, String cognom2) throws RemoteException,EOlympicsException{
        return gestorSubsistema1.getBusqueda(idIntern, nom, cognom1, cognom2);
    }

    /**
     * Afageix un usuari a la base de dades
     * @param usuariAdministrador Id intern de l'administrador que afegeix l'usuari
     * @param tipusUsuari tipus d'usuari del nou usuari
     * @param idUsuari id del usuari del nou usuari
     * @param pwd password del nou usuari
     * @param email email del nou usuari
     * @param estatEnSistema estat en el sistema del nou usuari
     * @param tipusDocumentId tipus de document del nou usuari
     * @param document document del nou usuari
     * @param nom nom del nou usuari
     * @param cognom1 primer cognom del nou usuari
     * @param cognom2 segon cognom del nou usuari
     * @param universitat en cas de ser un estudiant, el nom de l'universitat de l'estudiant
     * @return Retorna el id del nou usuari. En cas d'error throws una EOlympicsException
     * @throws  RemoteException
     * @throws EOlympicsException
     */
    public Integer sub1addUser(int usuariAdministrador, char tipusUsuari, String idUsuari, String pwd, String email, char estatEnSistema, String tipusDocumentId, String document, String nom, String cognom1, String cognom2, String universitat)  throws RemoteException,EOlympicsException{
        return gestorSubsistema1.addUser(usuariAdministrador, tipusUsuari, idUsuari, pwd, email, estatEnSistema, tipusDocumentId, document, nom, cognom1, cognom2, universitat);
    }

    /**
     * Modifica o dona de baixa un usuari a la base de dades
     * @param usuariAdministrador Id intern de l'administrador que modifica l'usuari o el dona de baixa
     * @param idIntern id intern de l'usuari
     * @param tipusUsuari tipus d'usuari de l'usuari
     * @param idUsuari id del usuari de l'usuari
     * @param pwd password de l'usuari
     * @param email email de l'usuari
     * @param estatEnSistema estat en el sistema de l'usuari
     * @param tipusDocumentId tipus de document de l'usuari
     * @param document document de l'usuari
     * @param nom nom de l'usuari
     * @param cognom1 primer cognom de l'usuari
     * @param cognom2 segon cognom de l'usuari
     * @param universitat en cas de ser un estudiant, el nom de l'universitat de l'estudiant
     * @param isBaixa en cas que l'usuari passi de estat A a B, aquest valor ha de ser true
     * @return Retorna el true en cas d'éxit o false en cas contrari
     * @throws  RemoteException
     * @throws EOlympicsException
     */
    public boolean sub1updateUser(int usuariAdministrador, int idIntern, char tipusUsuari, String idUsuari, String pwd, String email, char estatEnSistema, String tipusDocumentId, String document, String nom, String cognom1, String cognom2, String universitat, boolean isBaixa)  throws RemoteException,EOlympicsException{
        return gestorSubsistema1.updateUser(usuariAdministrador, idIntern, tipusUsuari, idUsuari, pwd, email, estatEnSistema, tipusDocumentId, document, nom, cognom1, cognom2, universitat, isBaixa);

    }

    /**
     * Elimina un usuari a la base de dades
     * @param idIntern id intern de l'usuari
     * @param tipusUsuari tipus d'usuari de l'usuari
     * @return Retorna el true en cas d'éxit o false en cas contrari
     * @throws  RemoteException
     * @throws EOlympicsException
     */
    public boolean sub1deleteUser(int idIntern, char tipusUsuari) throws RemoteException,EOlympicsException{
        return gestorSubsistema1.deleteUser(idIntern, tipusUsuari);
    }

    /**
     * Torna un vector amb les inscripcions d'un usuari
     * @param idIntern id intern de l'usuari
     * @return Retorna el vector en cas d'éxit, o null en cas contrari
     * @throws  RemoteException
     * @throws EOlympicsException
     */
    public Vector sub1getInscripcions(int idIntern) throws RemoteException,EOlympicsException{
        return gestorSubsistema1.getInscripcions(idIntern);
    }

    /**
     * Torna un vector amb les proves on l'usuari té inscripcions
     * @param idIntern id intern de l'usuari
     * @return Retorna el vector en cas d'éxit, o null en cas contrari
     * @throws  RemoteException
     * @throws EOlympicsException
     */
    public Vector sub1getProves(int idIntern) throws RemoteException,EOlympicsException{
        return gestorSubsistema1.getProves(idIntern);
    }

    /**
     * Torna un vector amb les rondes de les proves on l'usuari té inscripcions
     * @param idIntern id intern de l'usuari
     * @return Retorna el vector en cas d'éxit, o null en cas contrari
     * @throws  RemoteException
     * @throws EOlympicsException
     */
    public Vector sub1getRondes(int idIntern) throws RemoteException,EOlympicsException{
        return gestorSubsistema1.getRondes(idIntern);
    }

    /**
     * Torna un vector amb les participacions d'un usuari
     * @param idIntern id intern de l'usuari
     * @return Retorna el vector en cas d'éxit, o null en cas contrari
     * @throws  RemoteException
     * @throws EOlympicsException
     */
    public Vector sub1getParticipacions(int idIntern) throws RemoteException,EOlympicsException{
        return gestorSubsistema1.getParticipacions(idIntern);
    }
    //FI SUBSISTEMA CONNEXIÓ I MANTENIMENT





    //INICI SUBSISTEMA 2

    public List<Prova> sub2getLlistaProves(Prova prova) throws RemoteException, EOlympicsException
     {
         return gestorSubsistema2.getLlistaProves(prova);
     }
    public Prova sub2alta(Prova prova) throws RemoteException, EOlympicsException
    {
        return gestorSubsistema2.alta(prova);
    }
    public Ronda sub2alta(Ronda ronda)throws RemoteException, EOlympicsException
    {
        return gestorSubsistema2.alta(ronda);
    }
    public RespostaCorrecta sub2alta(RespostaCorrecta  respostaCorrecta)throws RemoteException, EOlympicsException
    {
        return gestorSubsistema2.alta(respostaCorrecta);
    }
    public RespostaCorrecta sub2carregaRespostaCorrecta(RespostaCorrecta respostaCorrecta)throws RemoteException, EOlympicsException
    {
        return gestorSubsistema2.carregaRespostaCorrecta(respostaCorrecta);
    }
    public Prova sub2modifica(Prova prova)throws RemoteException, EOlympicsException
    {
        return gestorSubsistema2.modifica(prova);
    }
    public Ronda sub2modifica(Ronda ronda)throws RemoteException, EOlympicsException
    {
        return gestorSubsistema2.modifica(ronda);
    }
    public void sub2modifica(RespostaCorrecta respostaCorrecta)throws RemoteException, EOlympicsException
    {
        gestorSubsistema2.modifica(respostaCorrecta);
    }
    public List <RespostaCorrecta> sub2getLlistaRespostes(Ronda ronda)throws RemoteException, EOlympicsException
    {
        return gestorSubsistema2.getLlistaRespostes(ronda);
    }
    public List<ControlInscripcionsDTO> sub2mostraControlInscripcions()throws RemoteException, EOlympicsException{
        return gestorSubsistema2.mostraControlInscripcions();
    }
    public void sub2tancaInscripcions(int usuari,int minim)throws RemoteException, EOlympicsException{
            gestorSubsistema2.tancaInscripcions(usuari, minim);
    }
    public List<RondaDTO> sub2cercarCompteticionsActives()throws RemoteException, EOlympicsException{
        return gestorSubsistema2.cercarCompteticionsActives();
    }
    public void sub2tancaCompeticio(Ronda ronda)throws RemoteException, EOlympicsException{
        gestorSubsistema2.tancaCompeticio(ronda);
    }
    public Integer sub2recomptaInscrits(Prova prova)throws RemoteException, EOlympicsException{
        return gestorSubsistema2.recomptaInscrits(prova);
    }
    public Ronda sub2carregaRonda(Ronda ronda)throws RemoteException, EOlympicsException{
        return gestorSubsistema2.carregaRonda(ronda);
    }
    public Prova sub2carregaProva(Prova prova)throws RemoteException, EOlympicsException{
        return gestorSubsistema2.carregaProva(prova);
    }
    public void sub2afegirRespostes(Ronda ronda,List<RespostaCorrecta> respostes,int usuari)throws RemoteException, EOlympicsException
    {
        gestorSubsistema2.afegirRespostes(ronda, respostes, usuari);
    }

    //FI SUBSISTEMA 2


    //INICI SUBSISTEMA 3

    public String sub3getNumProves (){
        return gestorSubsistema3.getNumProves();
    }

    public String sub3getNumProvesCurs(String estatPrevi, String estatFinal){
        return gestorSubsistema3.getNumProvesCurs(estatPrevi, estatFinal);
    }

    public String sub3getNumProvesInscrites(String estatProva){

        return gestorSubsistema3.getNumProvesInscrites(estatProva);
    }

    public String sub3getNumProvesFinalitzades(String estatProva){

        return gestorSubsistema3.getNumProvesFinalitzades(estatProva);
    }

    public String sub3getNumEstudiantsInscrits(){

        return gestorSubsistema3.getNumEstudiantsInscrits();
    }

    public String sub3getPuntuacioMitjana(){
        return gestorSubsistema3.getPuntuacioMitjana();
    }

    //FI SUBSISTEMA 3


    //INICI SUBSISTEMA ESTUDIANT
    public Estudiant sub4getDadesEstudiant(String username)throws RemoteException, EOlympicsException
     {
         return gestorSubsistema4.getDadesEstudiant(username);
     }

    
    public List<DtoProva> sub4getProvesEstudiant(Integer idEstudiant)throws RemoteException, EOlympicsException
     {
         return gestorSubsistema4.getProvesEstudiant(idEstudiant);
     }


    public Integer sub4getNombrePreguntes(Integer idProva, String tipusRonda)throws RemoteException, EOlympicsException
     {
         return gestorSubsistema4.getNombrePreguntes(idProva,tipusRonda);
     }

    public void sub4enviarFormulariRespostes(Participacio participacio, List<RespostaEstudiant> llistat)throws RemoteException, EOlympicsException
     {
         gestorSubsistema4.enviarFormulariRespostes(participacio, llistat);
     }


    public List<DtoProva> sub4getProvesDisponibles(Integer idEstudiant)throws RemoteException, EOlympicsException
     {
         return gestorSubsistema4.getProvesDisponibles(idEstudiant);
     }


    public List<DtoProva> sub4getHistoricProvesEstudiant(Integer idEstudiant)throws RemoteException, EOlympicsException
     {
         return gestorSubsistema4.getHistoricProvesEstudiant(idEstudiant);
     }


    public List<DtoParticipant> sub4getParticipantsProva(Integer idProva)throws RemoteException, EOlympicsException
     {
         return gestorSubsistema4.getParticipantsProva(idProva);
     }


    public List<DtoProva> sub4getProvesInscritesEstudiant(Integer idEstudiant)throws RemoteException, EOlympicsException
     {
        return gestorSubsistema4.geProvesInscritesEstudiant(idEstudiant);
     }


    public void sub4altaInscripcioProva(Integer idEstudiant, Integer idProva)throws RemoteException, EOlympicsException
     {
        gestorSubsistema4.altaInscripcioProva(idEstudiant, idProva);
     }

    public void sub4baixaInscripcioProva(Integer idEstudiant, Integer idProva)throws RemoteException, EOlympicsException
     {
         gestorSubsistema4.baixaInscripcioProva(idEstudiant, idProva);
     }


    public void sub4validarNumMaxProvesEstudiant(Integer idEstudiant)throws RemoteException, ErrorInscripcioException, EOlympicsException
     {
         gestorSubsistema4.validarNumMaxProvesEstudiant(idEstudiant);
     }


    public void sub4validarNumMaxParticipantsProva(Integer idProva)throws RemoteException, ErrorInscripcioException, EOlympicsException
     {
         gestorSubsistema4.validarNumMaxParticipantsProva(idProva);
     }


    public void sub4validarEstudiantSuperatEliminatoria(Integer idEstudiant, Integer idProva)throws RemoteException, ErrorParticipacioException, EOlympicsException
    {
        gestorSubsistema4.validarEstudiantSuperatEliminatoria(idEstudiant,idProva);
    }


    public void sub4validarNumMaxPreguntesFormulari(Integer idProva, String tipusRonda)throws RemoteException, ErrorParticipacioException, EOlympicsException
    {
        gestorSubsistema4.validarNumMaxPreguntesFormulari(idProva, tipusRonda);
    }
    
    //FI SUBSISTEMA ESTUDIANT

}
